#!/usr/bin/env python
# coding:utf-8


"""
开闭原则 (Open Closed Principle，OCP)
    一个软件实体（如类、模块、函数）应该：对扩展开放，对修改关闭。
    模块应尽量在不修改原代码的情况下进行扩展。
    在程序需要进行拓展的时候，不能去修改原有的代码，实现一个热插拔的效果。


里氏代换原则 (Liskov Substitution Principle，LSP)
    派生类(子类)对象能够替换其基类(父类)对象被调用。
    任何基类可以出现的地方，子类一定可以出现。
    该原则是继承复用的基石，只有当衍生类可以替换掉基类，软件单位的功能不受到影响时，基类才能真正被复用，而衍生类也能够在基类的基础上增加新的行为。
    里氏代换原则是对“开闭”原则的补充。
    实现“开闭”原则的关键步骤就是抽象化，而基类与子类的继承关系就是抽象化的具体实现，所以里氏代换原则是对实现抽象化的具体步骤的规范。


依赖倒转原则 (Dependency Inversion Principle，DIP)
    程序要依赖于抽象接口，不要依赖于具体实现。
    简单的说就是，要求对抽象进行编程，不要对实现进行编程，
    这样就降低了客户与实现模块间的耦合。


接口隔离原则 (Interface Segregation Principle，ISP)
    客户端不应该依赖它不需要的接口，类间的依赖关系应该建立在最小的接口上。
    尽量使用多个隔离的接口，而不是使用单个接口。
    目的是降低类之间的耦合度。


合成/聚合复用原则 (Composite/Aggregate Reuse Principle，CARP)
    (别名: 合成复用原则)
    在一个新的对象里通过关联关系（包括组合关系和聚合关系）来使用一些已有的对象，使之成为新对象的一部分；
    新对象通过委派调用已有对象的方法达到复用其已有功能的目的。
    它的设计原则是：要尽量使用组合/聚合，尽量不要使用继承。


最小知识原则 (Principle of Least Knowledge，PLK)
    (别名: 迪米特法则 Law of Demeter)
    一个软件实体应当尽可能少的与其他实体发生相互作用，使得系统功能模块相对独立。
    一个软件单位对其他的单位都只有最少的知识，而且局限于那些与本单位密切相关的软件单位。
    由于每个类尽量减少对其他类的依赖，因此，很容易使得系统的功能模块功能独立，相互之间不存在（或很少有）依赖关系。
    这样，当一个模块修改时，就会尽量少的影响其他的模块，扩展会相对容易，
    这是对软件实体之间通信的限制，它要求限制软件实体之间通信的宽度和深度。
    应用迪米特法则有可能造成的一个后果就是：系统中存在大量的中介类，
    这些类之所以存在完全是为了传递类之间的相互调用关系，这在一定程度上增加了系统的复杂度。
"""

